iT邦幫忙

2021 iThome 鐵人賽

DAY 18
1
DevOps

k8s 入門學習 30天系列 第 18

IT 鐵人賽 k8s 入門30天 -- day18 Task Configure Default Memory Requests and Limits for a Namespace

  • 分享至 

  • xImage
  •  

前言

今天要完成的項目 k8s Task: Memory-default-namesapce 這個 Task

佈署目標

1 建立一個 namespace

2 給這個 namespace 設定一個預設 Memory 設定值

3 佈署一個 Pod 不給定預設 Memory, 察看 Pod 啟動狀態確認是否設定成功

4 佈署一個 Pod 只給定 Memory Limit 不設定預設 Memory 值

5 佈署一個 Pod 只給定 Memory 需求, 不設定 Limit

建立一個 namespace

kubectl create namespace default-mem-example

建立一個名稱為 default-mem-example 的 Namespace

給這個 namespace 設定一個預設 Memory 設定值

建一個設定檔 memory-defaults.yaml

apiVersion: v1
kind: LimitRange
metadata:
  namespace: default-mem-example
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi
    type: Container

建立一個對 Container 的記憶體限制

並且套用在 Namespace default-mem-example

每個 Container 限制內容為上限 512Mi

每個 Container 預設給定的 256Mi

佈署指令如下:

kubectl apply -f memory-defaults.yaml

佈署一個 Pod 不給定預設 Memory, 察看 Pod 啟動狀態確認是否設定成功

建立設定 memory-defaults-pod.yaml 如下:

apiVersion: v1
kind: Pod
metadata:
  namespace: default-mem-example
  name: default-mem-demo
spec:
  containers:
  - name: default-mem-demo-ctr
    image: nginx

在 Namespace default-mem-example 建立一個 Pod

名稱設定為 default-mem-demo

使用 nginx 為 image

記憶體不做設定, 測試剛剛 LimitRange 是否會自動套用上設定值

建立指令如下:

kubectl apply -f memory-defaults-pod.yaml

查詢 Pod 佈署結果, 驗證預設定有效

kubectl get pod default-mem-demo --output=yaml --namespace=default-mem-example

結果如下:

Memory 預設配置有設定成功

清除佈署過的 Pod

kubectl delete -f memory-defaults-pod.yaml

佈署一個 Pod 只給定 Memory Limit 不設定預設 Memory 值

建立 memory-defaults-pod2.yaml 如下

apiVersion: v1
kind: Pod
metadata:
  namespace: default-mem-example
  name: default-mem-demo-2
spec:
  containers:
  - name: default-mem-demo-2-ctr
    image: nginx
    resources:
      limits:
        memory: "1Gi"

在 Namespace default-mem-example 建立一個 Pod

名稱設定為 default-mem-demo-2

使用 nginx 為 image

記憶體只設定了 Limit 值

建立指令如下:

kubectl apply -f memory-defaults-pod2.yaml

透過查詢指令

kubectl get pod default-mem-demo-2 --output=yaml --namespace=default-mem-example

結果如下:

發現由於有設定 Memory Limit 值, 所以不會套用 LimitRange 內的設定值

而是使用在 Pod 的佈署檔 Limit 值, 而因為 request 沒設定所以直接套用 Limit 值為 Request

清除佈署過的 Pod

kubectl delete -f memory-defaults-pod2.yaml

佈署一個 Pod 只給定 Memory 需求, 不設定 Limit

建立 memory-defaults-pod3.yaml 如下:

apiVersion: v1
kind: Pod
metadata:
  namespace: default-mem-example
  name: default-mem-demo-3
spec:
  containers:
  - name: default-mem-demo-3-ctr
    image: nginx
    resources:
      requests:
        memory: "128Mi"

在 Namespace default-mem-example 建立一個 Pod

名稱設定為 default-mem-demo-3

使用 nginx 為 image

記憶體只設定了 Request 值

建立指令如下:

kubectl apply -f memory-defaults-pod3.yaml

透過查詢指令

kubectl get pod default-mem-demo-3 --output=yaml --namespace=default-mem-example

結果如下:

發現由於有設定 Memory Request 值, 所以使用在 Pod 的佈署檔 Memory Request 值

沒有設定 Memory Limit 值, 所以套用了 LimitRange 設定的 Limit 值

清除佈署過的 Pod

kubectl delete -f memory-defaults-pod3.yaml

清除使用的 namespace

kubectl delete namespace default-mem-example

後記

在 Namespace 設定預設值可以讓 Namespace 記憶體管理更方便

首先是限制了每個 Container 必須有自己的 Memory 上限

並且控制了所有 Container 使用的 Memory 用量不會超過某個特定的值

前面佈署章節有講到, 設定檔的 apiVersion 會被 cluster 執行的 kubernetes version 影響

minikube 有個可以設定執行在 cluster 的 kubernetes version 的指令如下

minikube start --kubernetes-version=$specified_version

這樣一來就可以透過 minikube 執行所想測試 apiVersion 的設定檔佈署了

其他設定可以查詢minikube 官方指令文件參考


上一篇
IT 鐵人賽 k8s 入門30天 -- day17 Run automated tasks with cron jobs
下一篇
IT 鐵人賽 k8s 入門30天 -- day19 k8s Task Coarse Parallel Processing Using a Work Queue
系列文
k8s 入門學習 30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言